home *** CD-ROM | disk | FTP | other *** search
/ 3D Games - Real-time Rend…ng & Software Technology / 3D Games - Real-time Rendering & Software Technology.iso / flysdk / util / q2md2fly / q2md2fly.cpp next >
Encoding:
C/C++ Source or Header  |  2000-03-28  |  4.2 KB  |  189 lines

  1. #include "windows.h"
  2. #include "stdio.h"
  3. #include "math.h"
  4. #include "q2md2fly.h"
  5.  
  6. FILE *fm=0,*ff=0;
  7. dmdl_t dmdl;
  8.  
  9. float vert[MAX_VERTS][3];
  10. float uv[MAX_VERTS][2];
  11. short face[MAX_TRIANGLES][3];
  12. short faceuv[MAX_TRIANGLES][3];
  13. char framename[64]="";
  14. char skinname[64]="";
  15. int nstripfan,stripfancount[MAX_TRIANGLES];
  16. dcomandvertex_t stripfan[MAX_TRIANGLES*3];
  17.  
  18. void load_faces()
  19. {
  20.     dtriangle_t tri;
  21.     int i;
  22.  
  23.     fseek(fm,dmdl.ofs_tris,SEEK_SET);
  24.     for( i=0;i<dmdl.num_tris;i++ )
  25.     {
  26.         fread(&tri,1,sizeof(tri),fm);
  27.         face[i][2]=tri.index_xyz[0];
  28.         face[i][1]=tri.index_xyz[1];
  29.         face[i][0]=tri.index_xyz[2];
  30.         faceuv[i][2]=tri.index_st[0];
  31.         faceuv[i][1]=tri.index_st[1];
  32.         faceuv[i][0]=tri.index_st[2];
  33.     }
  34. }
  35.  
  36. void load_uv()
  37. {
  38.     dstvert_t st;
  39.     int i;
  40.  
  41.     fseek(fm,dmdl.ofs_st,SEEK_SET);
  42.     for( i=0;i<dmdl.num_st;i++ )
  43.     {
  44.         fread(&st,1,sizeof(st),fm);
  45.         uv[i][0]=(float)st.s/dmdl.skinwidth;
  46.         uv[i][1]=(float)st.t/dmdl.skinheight;
  47.     }
  48. }
  49.  
  50. void load_frame(int n)
  51. {
  52.     daliasframe_t frame;
  53.     int i;
  54.     mat4x4 mr;
  55.     vector v1,v2;
  56.     v1.vec(1,0,0);
  57.     v2.vec(0,1,0);
  58.     mr.load_identity();
  59.     mr.set_rotation(v1,-90);
  60.     mr.set_rotation(v2,90);
  61.  
  62.     fseek(fm,dmdl.ofs_frames+dmdl.framesize*n,SEEK_SET);
  63.     fread(&frame,1,sizeof(frame),fm);
  64.     strcpy(framename,frame.name);
  65.     fseek(fm,-(int)sizeof(dtrivertx_t),SEEK_CUR);
  66.     for( i=0;i<dmdl.num_xyz;i++ )
  67.     {
  68.         fread(frame.verts,1,sizeof(dtrivertx_t),fm);
  69.         v1.x=frame.verts->v[0]*frame.scale[0]+frame.translate[0];
  70.         v1.y=frame.verts->v[1]*frame.scale[1]+frame.translate[1];
  71.         v1.z=frame.verts->v[2]*frame.scale[2]+frame.translate[2];
  72.         v2=v1*mr;
  73.         vert[i][0]=v2.x;
  74.         vert[i][1]=v2.y;
  75.         vert[i][2]=v2.z;
  76.     }
  77. }
  78.  
  79. void write_head()
  80. {
  81.     float f[3]={ 0,0,0 };
  82.     int i;
  83.     
  84.     i=9171;
  85.     fwrite(&i,1,sizeof(int),ff);
  86.  
  87.     i=dmdl.num_tris;
  88.     fwrite(&i,1,sizeof(int),ff);
  89.  
  90.     i=dmdl.num_xyz;
  91.     fwrite(&i,1,sizeof(int),ff);
  92.  
  93.     i=dmdl.num_frames;
  94.     fwrite(&i,1,sizeof(int),ff);
  95.  
  96.     fwrite(f,3,sizeof(float),ff);
  97.  
  98.     fwrite(skinname,1,64,ff);
  99.  
  100.     fwrite(&face[0][0],dmdl.num_tris,sizeof(short)*3,ff);
  101.  
  102.     for( i=0;i<dmdl.num_tris;i++ )
  103.     {
  104.         fwrite(&uv[faceuv[i][0]],2,sizeof(float),ff);
  105.         fwrite(&uv[faceuv[i][1]],2,sizeof(float),ff);
  106.         fwrite(&uv[faceuv[i][2]],2,sizeof(float),ff);
  107.     }
  108. }
  109.  
  110. main(int an,char **av)
  111. {
  112.     if (an==2 || an==3)
  113.     {
  114.         fm=fopen(av[1],"rb");
  115.         if (fm)
  116.             {
  117.             fread(&dmdl,1,sizeof(dmdl),fm);
  118.             if (dmdl.ident==IDALIASHEADER && dmdl.version==8)
  119.                 {
  120.                 char str[256];
  121.                 int n=0;
  122.                 if (strrchr(av[1],'\\'))
  123.                     strcpy(str,strrchr(av[1],'\\')+1);
  124.                 else
  125.                 if (strrchr(av[1],'/'))
  126.                     strcpy(str,strrchr(av[1],'/')+1);
  127.                 else
  128.                     strcpy(str,av[1]);
  129.                 if (strrchr(str,'.'))
  130.                     *strrchr(str,'.')=0;
  131.                 strcpy(skinname,str);
  132.                 strcat(skinname,".tga");
  133.                 if (an==3)
  134.                 {
  135.                     strcat(str,"_");
  136.                     strcat(str,av[2]);
  137.                 }
  138.                 strcat(str,".fao");
  139.                 printf("filename  : %s\n",str);
  140.                 printf("skinname  : %s\n",skinname);
  141.                 ff=fopen(str,"wb");
  142.                 if (ff)
  143.                     {
  144.                     load_faces();
  145.                     load_uv();
  146.                     printf("num_faces : %i\nnum_verts : %i\nnum_uv    : %i\nnum_frames: %i\n",dmdl.num_tris,dmdl.num_xyz,dmdl.num_st,dmdl.num_frames);
  147.                     write_head();
  148.  
  149.                     for( int i=0;i<dmdl.num_frames;i++ )
  150.                         {
  151.                         load_frame(i);
  152.                         if (an==3 && strncmp(framename,av[2],strlen(av[2])))
  153.                             continue;
  154.                         n++;
  155.                         printf("frame %02i  : %s\n",n,framename);
  156.                         fwrite(&vert[0][0],dmdl.num_xyz,sizeof(float)*3,ff);
  157.                         }
  158.  
  159.                     fseek(fm,dmdl.ofs_glcmds,SEEK_SET);
  160.                     nstripfan=0;
  161.                     i=0;
  162.                     while(1)
  163.                     {    
  164.                         fread(&stripfancount[nstripfan],1,sizeof(int),fm);
  165.                         if (stripfancount[nstripfan]==0) 
  166.                             break;
  167.                         fread(&stripfan[i],abs(stripfancount[nstripfan]),sizeof(dcomandvertex_t),fm);
  168.                         i+=abs(stripfancount[nstripfan]);
  169.                         nstripfan++;
  170.                     } 
  171.                     fwrite(&nstripfan,1,sizeof(int),ff);
  172.                     fwrite(&stripfancount[0],nstripfan,sizeof(int),ff);
  173.                     fwrite(&i,1,sizeof(int),ff);
  174.                     fwrite(&stripfan[0],i,sizeof(dcomandvertex_t),ff);
  175.  
  176.                     fseek(ff,12,SEEK_SET);
  177.                     fwrite(&n,1,sizeof(int),ff);
  178.                     fclose(ff);
  179.                     }
  180.                 }
  181.             fclose(fm);
  182.             return 1;
  183.             }
  184.     }
  185.     printf("Fly3D quake2 md2 converter\n");
  186.     printf("use: q2md2fly q2model.md2 [animname]\n");
  187.     return 0;
  188. }
  189.